/**
 * 市场导航控制器
 * 负责请求市场导航的数据和显示市场导航
 */
function MarketTreeController() { 
    var _this = this;
    var market_tree_view;

    var init = function () {
        // 初始化市场导航视图
        market_tree_view = new MarketTreeView(_this);
        market_tree_view.createControls();
    }
    /**
     * 获取市场导航的根节点信息
     * @param  {Function} callback 回调函数 这个函数必须有1个参数用于接收查询到的结果
     * result['id']
     * result['hastypes']
     * result['name']
     */
    var getMarketTree = function(callback) {
        $.getJSON("controller.php?action=createMarketTree&pid=0&hastypes=0", function(result) {
            callback(result);
        });
    };
    /**
     * 获取市场导航子节点的信息
     * @param  {int}   pid      该节点的id
     * @param  {int}   hastypes 0:可以继续展开（非叶子节点）1:不能展开（叶子节点）
     * @param  {Function} callback 回调函数 必须有3个参数 由于接收pid,hasypes,result
     * hastypes=0
     * result['id']
     * result['hastypes']
     * result['name']
     * hastypes=1
     * result['id']
     * result['techlevel']
     * result['wastfactor']
     * result['name']
     */
    var getSubTree = function(pid, hastypes, callback) {
        $.getJSON("controller.php?action=createMarketTree&pid=" + pid + "&hastypes=" + hastypes, function(result) {
            callback(pid, hastypes, result);
        });
    };
    /**
     * 显示市场导航的根节点信息
     */
    _this.showMarketTree = function () {
        getMarketTree(market_tree_view.drawMarketTree)
    }
    /**
     * 显示市场导航的子项
     */
    _this.showSubTree = function () {
        var pid = market_tree_view.getId(this);
        var hastypes = market_tree_view.getHastypes(this);
        if(!$("#sub_" + pid).children().is("li")) {
            getSubTree(pid, hastypes,market_tree_view.drawSubTree);
        }
        return false;
    }
    init();
}

/**
 * 造价控制器
 */
function PriceController() {
    var _this = this;
    var price_view;
    var price_model;
    var materials;
    var id;
    var request_state;
    var button_state;

    var init = function () {
        // 初始化造价模型
        price_model = new PriceModel();
        // 初始化造价计算视图
        price_view = new PriceView(_this,price_model);
        price_view.createControls();
        materials = null;
        setRequestState(false);
        setButtonState(false);
        setId(null);
    }
    /**
     * 从服务器获取物品材料的详细信息
     * @param  {int}   id       物品id
     * @param  {Function} callback 回调函数 必须要有1个参数，用于接收result
     * result[n]['id'] // 材料id
     * result[n]['name'] // 材料名称
     * result[n]['quantity'] // 材料需求量
     * result[n]['damage_per_job'] // 材料损耗百分比
     * result[n]['sell'] //市场最低卖价 
     * result[n]['buy']  //市场最高买价  
     */
    var requestMaterials = function(id, callback) {
        $.getJSON("controller.php?action=getRequirements&id=" + id, function(result) {
            callback(result);
        });
    };
    /**
     * 当选中物品时后台开始加载信息
     */
    _this.backGroundLoad = function () {
        setRequestState(false);
        setId(price_view.getId(this));
        // 判断科技等级并隐藏不需要输入的界面
        if(price_view.getTechLevel(this) == 1){
            price_view.hideT2InputView();
        }
        else{
            price_view.showT2InputView();
        }
        var name = price_view.getName(this);
        price_view.setItemName(name);
        requestMaterials(id,showInfo);    
    }
    /**
     * 当“计算”按钮被点击时执行
     */
    _this.buttonClicked = function () { 
        setButtonState(true);
        if(getId() != null && getRequestState() == false)
            price_view.showWait();
        else if(getId() != null && getRequestState() == true)
            showPrice();
    }
    /**
     * 获取造价
     * @return {ma}
     */
    _this.getProducePrice = function () {
        return price_model.getPrice();
    }
    /**
     * 获取总价
     * @return {float}
     */
    _this.getProduceTotalPrice = function () {
        return price_model.getTotalPrice();
    }
    /**
     * 根据“计算”按钮的状态判断要不要显示造价
     * 回调函数 这个函数在请求服务器数据完成后执行
     * @param  {materials} result 具体参考requestMaterials定义处
     */
    var showInfo = function (result) {
        // 保存物品材料信息
        setMaterials(result);
        var button_state = getButtonState();
        // 如果用户点击了“计算”按钮
        if(button_state == true){
            showPrice();
        }
        setRequestState(true);
    }
    /**
     * 显示造价
     */
    var showPrice = function () {
        var ml = price_view.getMl();
        var sl = price_view.getSl();
        var wf = price_view.getWf(id);
        if(checkInput(ml) == false)
            ml = 0;
        calculateT1(getMaterials(),ml,sl,wf);
        setButtonState(false);
    }
    /**
     * 计算物品造价
     */
    var calculateT1 = function (ma,ml,sl,wf) {
       price_model.calculate(ma,ml,sl,wf); 
    }
    /**
     * 检查用户输入数据的正确性
     * @returns {bool} 正确返回true 错误返回false 
     */
    var checkInput = function (ml) {
        if(isNaN(parseInt(ml)))
            return false;
        else
           return true;
    }
    /**
     * 获取当前选中物品的id
     * @return {int} 
     */
    var getId = function () {
        return id;
    }
    /**
     * 设置当前选中物品id
     * @param {int} i 
     */
    var setId = function (i) {
        id = i;
    }
    /**
     * 获取物品材料信息
     * @return {materials} 具体参照requestMaterials的注释
     */
    var getMaterials = function () {
        return materials;
    }
    /**
     * 设置物品材料信息
     * @param {materials} m 具体参照requestMaterials的注释
     */
    var setMaterials = function (m) {
        materials = m;
    }
    /**
     * 获取“计算”按钮点击的状态
     * @return {bool} true:点击过了 false:还没点击
     */
    var getButtonState = function () {
        return button_state;
    }
    /**
     * 设置“计算”按钮点击的状态
     * @param {bool} state true和false两个状态
     */
    var setButtonState = function (state) {
        button_state = state;
    }
    /**
     * 获取请求的状态
     * @return {bool} true:请求完成 false:请求没有完成
     */
    var getRequestState = function () {
        return request_state; 
    }
    /**
     * 设置请求的状态
     * @param {bool} rs 
     */
    var setRequestState = function (rs) {
        request_state = rs;
    }
    init();
}